AWS Glue ジョブキューイングが使用可能になったので試してみました!
AWS事業本部コンサルティング部の石川です。AWS Glueでジョブキューイング機能が利用可能になりました。本記事では、ジョブキューイングがどのような既存の課題を解決するのか、実際に動作を確認しながら解説します。
AWS Glue ジョブキューイングとは
AWS Glue は、同時に複数のクエリを実行するとアカウントレベルのクォータ(使用できる制限)まで実行しますが、上限に達するとエラーになり、ジョブの実行が失敗します。そのため、上限に達した場合の上限緩和申請やそれでも対応できない場合のリトライの考慮が必要でした。
ジョブキューイングを有効にすると、上限に達した場合、キュー(待ち行列)に入れ、制限が解放されるのを待ちます。制限内で利用可能になると、AWS Glue はジョブの実行を再試行します。
AWS Glue ジョブキューイングが有用なユースケース
リソース利用不可などの制限がある場合、Glue ジョブはキューに入れられます。AWS Glue ジョブキューイングは、AWS マネジメントコンソールまたは API/CLI を使用してジョブで有効にできます。
同時実行数がスパイクする場合
ジョブの実行が集中的に発生して、最大同時ジョブ実行数に達してしまう場合です。特にイベント処理でAWS Glue ジョブを実行するユースケースでは、同時実行数を事前に把握することが困難です。
多くのData Processing Units (DPU)が必要な場合
大量のデータを短時間で処理する必要があり、ジョブが大きなDPUを割り当てている場合です。過去データ移行や月次や年次などのバッチ処理で大量のDPUを用いるユースケースです。
VPC の IP アドレス枯渇
AWS Glue ジョブがVPC上のリソースにアクセスして、セキュアな通信を維持しながら、スケーラブルな処理が必要な場合です。AWS Glueでは、VPC上のリソースに対する処理を行う場合、Elastic Network Interface (ENI)を介してプライベートアクセスが必要になります。AWS Glueは、プライベートIPアドレスはDPUごとに必要になり、指定されたVPCのプライベートサブネット内に複数のENIを作成します。ジョブに割り当てるDPUの数が増えれば、それに応じて必要なプライベートIPアドレスの数も増加します。
AWS Glue ジョブキューイングを試す!
キューイングしないジョブの実行した場合
コマンドラインから3回実行すると、2回目以降のジョブ実行がエラーで実行できません。
$ aws glue start-job-run --job-name non-queuing-job
{
"JobRunId": "jr_5d63896c85daff4b1cd9d3f0516ddac8b6ad858e23b9f5e7cb2027c4ff4014b7"
}
$ aws glue start-job-run --job-name non-queuing-job
An error occurred (ConcurrentRunsExceededException) when calling the StartJobRun operation: Concurrent runs exceeded.
$ aws glue start-job-run --job-name non-queuing-job
An error occurred (ConcurrentRunsExceededException) when calling the StartJobRun operation: Concurrent runs exceeded.
マネジメントコンソールから実行した場合も同様にエラーになります。
新しいキューイングしたジョブの実行した場合
キューイングするには、Job details の Job Run Queuing を有効にします。
では、準備が整ったので実行します。先ほどと同じようにコマンドラインから3回実行しましたが、3つともエラーになりません。
aws glue start-job-run --job-name queuing-job
{
"JobRunId": "jr_5a3ba3d412496b00a7f857b452b19c59dba730009afecd7f7eeae5bd0b5e5a59"
}
$ aws glue start-job-run --job-name queuing-job
{
"JobRunId": "jr_17c5aec09af33349dd1f7d3efc622622c2e6476f2006a1f9ae8385e8b013e4c1"
}
$ aws glue start-job-run --job-name queuing-job
{
"JobRunId": "jr_52c36f33a37d2eb0e16c1c98e7f7f465590ad5b38e00bb7a3e80c4bbdd706f4e"
}
1つ目のジョブのRun StatusがRunning
(実行中)になり、2回目以降のジョブ実行のRun StatusがWaiting
(待ち状態)になります。
1つ目のジョブがSucceded
(正常終了)すると、2つ目のジョブがRunning
(実行中)になりました。
2つ目のジョブがSucceded
(正常終了)すると、3つ目のジョブがRunning
(実行中)になりました。
最終的に、3つ目のジョブがSucceded
(正常終了)しました。キューは、FIFO(First-In-First-Out: 先入れ先出し)なのか?という疑問が湧いてきました。
AWS Glue ジョブキューイングは、FIFOなのか?
AWS Glueのジョブキューイング機能は、FIFOキューではありません。この新機能は、ジョブの優先順位付けと実行順序の制御を可能にしますが、厳密なFIFO(First-In-First-Out: 先入れ先出し)ではありません。
AWS Glueのジョブキューイングの仕組みは、以下の通りです。
-
優先順位ベース
- ジョブには優先順位を設定でき、高優先度のジョブが先に実行されます。
-
リソース管理
- 同時実行数の制限に達した場合、新しいジョブはキューに入れられます。
-
柔軟性
- キューイングはワークロードグループごとに設定可能で、異なるタイプのジョブに対して異なるキューイング戦略を適用できます。
この機能により、AWS Glueユーザーはジョブの実行順序をより細かく制御し、リソースの効率的な利用が可能になります。ただし、厳密なFIFO方式ではなく、優先順位や他の要因によって実行順序が決定されることに注意が必要です。
参考: アカウントレベルのクォータ
アカウントレベルのクォータは、デフォルトと現在の設定をマネジメントコンソールのService Quotasから確認できます。
ジョブ関連のサービスクオータ
Glueのサービスクオータの中で、ジョブ関連のサービスクオータは以下のとおりです。
DPU関連のサービスクオータ
Glueのサービスクオータの中で、DPU関連のサービスクオータは以下のとおりです。
最後に
今回挙げたユースケースの経験がない人は、上限緩和やリトライ実装で済むのではないかと安易に考えるかもしれません。しかし、単にDPUの上限を緩和するだけでなく、他の上限緩和も必要になるケースや、VPCのCIDRで確保できるENIの数が不足するケースも多々あります。大規模でミッションクリティカルなユースケースにおいては、事後の対応では深刻な影響を招きかねません。
その点、Glue ジョブのキューイングは限られたAWSリソースを活かし、シンプルに安定してジョブを実行できるようになります。さらに優先順位やワークロードグループを用いることで複雑なユースケースにも対処が期待できます。